' Written by Craig'n'Dave
Module Module1
    ' Breadth first traversal
    Function bft(graph As Dictionary(Of String, List(Of String)), current_vertex As String)
        Dim visited As New List(Of String)
        Dim q As New Queue()
        visited.Add(current_vertex)
        Do While current_vertex <> Nothing
            For Each vertex In graph.Item(current_vertex)
                If Not visited.Contains(vertex) Then
                    q.Enqueue(vertex)
                    visited.Add(vertex)
                End If
            Next
            If q.Count > 0 Then current_vertex = q.Dequeue() Else current_vertex = Nothing
        Loop
        Return visited
    End Function

    Sub main()
        ' Main program starts here
        Dim graph = New Dictionary(Of String, List(Of String)) From {
            {"A", New List(Of String) From {"B", "C", "D"}},
            {"B", New List(Of String) From {"A", "E"}},
            {"C", New List(Of String) From {"A", "D"}},
            {"D", New List(Of String) From {"A", "C", "F"}},
            {"E", New List(Of String) From {"B", "G"}},
            {"F", New List(Of String) From {"D"}},
            {"G", New List(Of String) From {"E"}}
            }
        Dim visited As New List(Of String)
        visited = bft(graph, "A")
        Console.WriteLine(String.Join(", ", visited))
    End Sub
End Module
